package com.yhq.basic.algorithm;

import com.yhq.basic.algorithm.array.CircleSingleLinked;
import lombok.SneakyThrows;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author hqyin
 * @date 2023/8/4 6:56 下午
 */
public class CommonAlgorithm {
    public static void main(String[] args) {
        //判断一个数是否是2的N次方
//        test_check2Power();

        //给你一个文件里面包含全国人民(14亿)的年龄数据(0~180)，现在要你统计每一个年龄有多少人？
//        test_statisticAgeCnt("");

        //字符串使用重载+
//        test_addString();

        // max  //exist  //顺序 //需要删除 // 循环单向链表
        //初始化数据
        int max = 5;
        int exit = 3;
        CircleSingleLinked<Integer> list = new CircleSingleLinked<>();
        for(int i = 1;i<=max;i++) {
            list.add(i);
        }

        //循环移除
        Integer result = list.josephus(exit);
        System.out.println("=======>result:"+result);


    }

    /**
     * 字符串使用重载+
     */
    private static void test_addString() {
        String a = "ja";
        String b = "va";
        String c = "java";
        String d = a+b;
        //返回结果false，原因：重载+加号，底层使用StringBuilder 的append方法
        System.out.println(d == c);
    }

    /**
     * 给你一个文件里面包含全国人民(14亿)的年龄数据(0~180)，现在要你统计每一个年龄有多少人？
     */
    @SneakyThrows
    private static void test_statisticAgeCnt(String fileName) {
        Scanner scanner = new Scanner(new File(fileName));
        while (scanner.hasNext()) {
            scanner.nextLine();
        }

        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        reader.readLine();
    }

    /**
     * 判断一个数是否是2的N次方
     */
    private static void test_check2Power() {
        for (int i = 0; i < 10; i++) {
            System.out.println("判断" + i + "是否是2的N次方:" + check2Power2(i));;
        }
    }

    /**
     * 判断一个数是否是2的N次方
     * 方案一 常规循环判断
     * @param i
     * @return
     */
    private static boolean check2Power(int i) {
        boolean result = true;
        while (i>1) {
            if(i%2 == 0) {
                i = i/2;
            } else {
                result = false;
                break;
            }
        }
        return result;
    }

    /**
     * 判断一个数是否是2的N次方
     * 方案二 按位与
     * 1 01
     * 2 10
     * 3 011
     * 4 100
     * @param i
     * @return
     */
    private static boolean check2Power2(int i) {
        if(i==1) {
            return true;
        } else if(i <1) {
            return false;
        } else {
            return (i&(i-1))==0;
        }
    }
}
